#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define inf 1e18
#define rep(i, n) for (int i = 0; i < (n); ++i)

// 检查在给定价格阈值下，是否能在预算内购买相应数量的物品
bool check(ll limit, const vector<ll> &p, ll budget) {
  ll cost = 0;
  rep(i, p.size()) {
    // 计算对于第i种物品，在价格阈值为limit时最多能买多少个
    // 购买k个的边际成本是(2k-1)*p[i]
    // 我们要找最大的k使得(2k-1)*p[i] <= limit
    // 即 k <= (limit/p[i] + 1)/2
    ll cnt = (limit / p[i] + 1) / 2;
    if (cnt == 0)
      continue;
    // 检查是否会溢出
    if (cnt > budget / cnt / p[i]) {
      return false;
    }
    cost += cnt * cnt * p[i];
    if (cost > budget)
      return false;
  }
  return true;
}

int main() {
  int n;
  ll m;
  cin >> n >> m;
  vector<ll> p(n);
  rep(i, n) { cin >> p[i]; }

  // 二分答案：枚举一个价格阈值
  ll l = 0, r = inf; // 使用r作为最终的价格阈值
  ll limit;
  while (l <= r) {
    ll mid = (l + r) / 2;
    if (check(mid, p, m)) {
      l = mid + 1;
      limit = mid;
    } else {
      r = mid - 1;
    }
  }

  // 根据找到的价格阈值计算实际购买数量
  ll ans = 0;
  ll rem = m;
  rep(i, n) {
    ll cnt = (limit / p[i] + 1) / 2;
    ans += cnt;
    rem -= cnt * cnt * p[i];
  }

  // 计算还能额外购买多少个物品
  int extra = 0;
  rep(i, n) {
    ll cnt = (limit / p[i] + 1) / 2;
    ll next_cost = (2 * cnt + 1) * p[i]; // 下一个物品的成本
    if (next_cost == limit + 1) {
      extra++;
    }
  }

  ans += min((ll)extra, rem / (limit + 1));
  cout << ans << "\n";
}